import config from '@/config/http'
import util from '@/utils/util'
import {userStore} from '@/store'

// 这里的vm，就是我们在vue文件里面的this，所以我们能在这里获取vuex的变量，比如存放在里面的token变量
const install = (app) => {
	// 此为自定义配置参数，具体参数见上方说明
	uni.$u.http.setConfig((conf: object) => {
		Object.assign(conf, config)
    return conf
	})
	// 请求拦截，配置Token等参数
	const store = userStore();
  uni.$u.http.interceptors.request.use((config: {header: {authorization: string, url: string, Cookie: string, noToken: boolean}}) => {
		// 方式二，如果没有使用uView封装的vuex方法，那么需要使用$store获取
		config.header.authorization = store.access_token
		// #ifndef H5
		let sess = uni.getStorageSync('PHPSESSID')
		if(!sess){
			sess = uni.$u.guid(32)
			uni.setStorageSync('PHPSESSID', sess)
		}
		config.header.Cookie = 'PHPSESSID=' + (sess.value || sess)
		// #endif
		// 可以对某个url进行特别处理，此url参数为uni.$u.http.get(url)中的url值
		if(config.url == 'visitor/login') config.header.noToken = true;
		// 最后需要将config进行return
		// config.data = uni.$u.queryParams(config.data, false)
		return config
		// 如果return一个false值，则会取消本次请求
	})

	// 响应拦截，判断状态码是否通过
	uni.$u.http.interceptors.response.use(({data, statusCode, errMsg}) => {
		if(statusCode===200) {
			data.msg && util.msg(data.msg, data.code==200 ? 'success' : 'none')
			if(data.code===200){
        return data.data
      }else if(data.code==241){
				store.showAuth = true
			}
			// #ifdef MP-WEIXIN
			else if (data.code == 242) {
				store.showAuth = true
			}
			// #endif
			else if (data.code == 243) {
				util.rdrto(store.idtype+'/profile/add')
			} else if (data.code == 244) {
				util.navto(store.idtype + '/profile/view', {id: data.id})
			} else if (data.code == 245) {
				util.navto(store.idtype + '/profile/view', {id: data.id})
			} else if (config.jumps[data.code]) {
				util.navto(config.jumps[data.code])
			} else {
        throw new Error(data.msg);
      }
		} else {
			// #ifdef MP-WEIXIN
			(statusCode===401 || statusCode===241) && store.logout()
			// #endif
			// #ifndef MP-WEIXIN
			// (statusCode===401 || statusCode===241) && store.user.logout()
			if(statusCode===401 || statusCode===241){
				uni.$emit('auth')
			}
			/*
			if(config.jumps[statusCode]){
				uni.$u.route('/pages/' + config.jumps[statusCode])
			}
			*/
			// #endif
			errMsg && util.msg(errMsg)
			// 如果返回false，则会调用Promise的reject回调，
			// 并将进入uni.$u.http.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
			throw new Error(errMsg)
		}
	})
}

export default {
	install
}